<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="PeFxh" id="PeFxh"><span data-lake-id="u7001bf7a" id="u7001bf7a">典型回答</span></h1>
  <p data-lake-id="u1b1b788e" id="u1b1b788e"><br></p>
  <p data-lake-id="u08ab0b2e" id="u08ab0b2e"><span data-lake-id="u33a074c2" id="u33a074c2">Dubbo提供了缓存机制，其主要作用是缓存服务调用的响应结果，减少重复调用服务的次数，提高调用性能。</span></p>
  <p data-lake-id="u5c189bb8" id="u5c189bb8"><span data-lake-id="uf7e6d860" id="uf7e6d860">​</span><br></p>
  <p data-lake-id="u9363c6b8" id="u9363c6b8"><span data-lake-id="u67b5a72c" id="u67b5a72c">Dubbo支持了服务端结果缓存和客户端结果缓存。</span></p>
  <p data-lake-id="u25ea3285" id="u25ea3285"><span data-lake-id="ua1044d74" id="ua1044d74">​</span><br></p>
  <p data-lake-id="u68030214" id="u68030214"><strong><span data-lake-id="uf94d6372" id="uf94d6372">服务端缓存</span></strong><span data-lake-id="u7bce5afe" id="u7bce5afe">是指将服务端方法的返回结果缓存到内存中，以便下次请求时可以直接从缓存中获取结果，而不必再调用服务方法。服务端缓存可以提高响应速度和系统吞吐量。Dubbo提供了三种服务端缓存的实现方式：</span></p>
  <ul list="uf1466371" data-lake-index-type="true">
   <li fid="u2cc47d43" data-lake-id="u7d5c71a9" id="u7d5c71a9"><span data-lake-id="u22995e8c" id="u22995e8c">LRU Cache: 使用基于LRU(最近最少使用)算法的缓存，当缓存空间满时，会将最近最少使用的缓存清除掉。</span></li>
   <li fid="u2cc47d43" data-lake-id="u523f5a5d" id="u523f5a5d"><span data-lake-id="u85f37706" id="u85f37706">Thread Local Cache: 使用线程本地缓存，即每个线程都拥有一个缓存实例，缓存结果只对当前线程可见。</span></li>
   <li fid="u2cc47d43" data-lake-id="u8a21888a" id="u8a21888a"><span data-lake-id="ud9d320a6" id="ud9d320a6">Concurrent Map Cache: 使用基于ConcurrentMap的缓存，支持并发读写，相对LRU Cache和Thread Local Cache来说，缓存效率更高。</span></li>
  </ul>
  <p data-lake-id="u0815f17e" id="u0815f17e"><span data-lake-id="ub7df06d8" id="ub7df06d8">​</span><br></p>
  <p data-lake-id="uddfe613b" id="uddfe613b"><strong><span data-lake-id="u99191c79" id="u99191c79">客户端缓存</span></strong><span data-lake-id="ufff05190" id="ufff05190">是指客户端将调用远程服务方法的返回结果缓存到内存中，以便下次请求时可以直接从缓存中获取结果，而不必再调用远程服务方法。消费端缓存可以提高系统的响应速度和降低系统的负载。Dubbo提供了两种消费端缓存的实现方式：</span></p>
  <ul list="u855b68d3" data-lake-index-type="true">
   <li fid="u23d55056" data-lake-id="u15f8056f" id="u15f8056f"><span data-lake-id="uf0f68192" id="uf0f68192">LRU Cache: 使用基于LRU算法的缓存，当缓存空间满时，会将最近最少使用的缓存清除掉。</span></li>
   <li fid="u23d55056" data-lake-id="u1d7ed600" id="u1d7ed600"><span data-lake-id="uad4a34b9" id="uad4a34b9">Thread Local Cache: 使用线程本地缓存，即每个线程都拥有一个缓存实例，缓存结果只对当前线程可见。</span></li>
  </ul>
  <p data-lake-id="u3be456c4" id="u3be456c4"><br></p>
  <p data-lake-id="u07bdd90b" id="u07bdd90b"><span data-lake-id="ube9175af" id="ube9175af">需要注意的是，缓存虽好用，使用需谨慎，过度依赖缓存可能会出现数据不一致的问题。</span></p>
  <h1 data-lake-id="tIRB6" id="tIRB6"><span data-lake-id="u95bddf90" id="u95bddf90">扩展知识</span></h1>
  <p data-lake-id="uf3bd2950" id="uf3bd2950"><br></p>
  <h2 data-lake-id="l2F28" id="l2F28"><span data-lake-id="u1997958f" id="u1997958f">服务端缓存</span></h2>
  <p data-lake-id="ud4c8c67d" id="ud4c8c67d" style="text-align: left"><br></p>
  <p data-lake-id="u708e473d" id="u708e473d" style="text-align: left"><span data-lake-id="ud8c471ed" id="ud8c471ed">接口维度的服务端缓存配置方式支持XML和注解两种：</span></p>
  <p data-lake-id="ub6f48b21" id="ub6f48b21" style="text-align: left"><span data-lake-id="u18d72f26" id="u18d72f26">XML配置：</span></p>
  <pre lang="java"><code>
&lt;bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/&gt;
&lt;dubbo:service interface="com.foo.DemoService" ref="demoService" cache="lru" /&gt; 
</code></pre>
  <p data-lake-id="uba19b955" id="uba19b955" style="text-align: left"><span data-lake-id="u95a4db53" id="u95a4db53" class="lake-fontsize-12" style="color: rgb(34, 34, 34)">注解配置方式：</span></p>
  <pre lang="java"><code>
@DubboService(cache = "lru")
public class DemoServiceImpl implements DemoService {

    private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);
    @Override
    public String sayHello(String name) {
        logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return "Hello " + name;

    }

}
</code></pre>
  <p data-lake-id="uba5352e5" id="uba5352e5"><br></p>
  <p data-lake-id="u849b1828" id="u849b1828"><br></p>
  <p data-lake-id="u24dedf4b" id="u24dedf4b"><span data-lake-id="u6f09f917" id="u6f09f917" class="lake-fontsize-12">还支持方法维度的缓存配置，同样支持XML和注解两种：</span></p>
  <p data-lake-id="u7817b075" id="u7817b075"><span data-lake-id="u31342093" id="u31342093" class="lake-fontsize-12">​</span><br></p>
  <pre lang="java"><code>
&lt;bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/&gt;
&lt;dubbo:service interface="com.foo.DemoService" ref="demoService" cache="lru" /&gt;
    &lt;dubbo:method name="sayHello" cache="lru" /&gt;
&lt;/dubbo:service&gt;
</code></pre>
  <p data-lake-id="u29b257a7" id="u29b257a7"><br></p>
  <pre lang="java"><code>
@DubboService(methods = {@Method(name="sayHello",cache = "lru")})
public class DemoServiceImpl implements DemoService {

    private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);
    @Override
    public String sayHello(String name) {
        logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return "Hello " + name;

    }

}
</code></pre>
  <p data-lake-id="uabbda0d4" id="uabbda0d4"><br></p>
  <h2 data-lake-id="YHlQh" id="YHlQh"><span data-lake-id="ua9849f42" id="ua9849f42">客户端缓存</span></h2>
  <p data-lake-id="uae42bf39" id="uae42bf39"><br></p>
  <p data-lake-id="u463e07ed" id="u463e07ed"><span data-lake-id="u31b87861" id="u31b87861" class="lake-fontsize-12">接口维度：</span></p>
  <p data-lake-id="uc54aaea4" id="uc54aaea4"><span data-lake-id="ue9233aa9" id="ue9233aa9" class="lake-fontsize-12">​</span><br></p>
  <pre lang="java"><code>
&lt;dubbo:reference interface="com.foo.DemoService" cache="lru" /&gt;
</code></pre>
  <p data-lake-id="ucb3b2132" id="ucb3b2132"><span data-lake-id="u9d2d21de" id="u9d2d21de" class="lake-fontsize-12">或者：</span></p>
  <p data-lake-id="u67926907" id="u67926907"><span data-lake-id="uc56dd2fa" id="uc56dd2fa" class="lake-fontsize-12">​</span><br></p>
  <pre lang="java"><code>
@DubboReference(cache = "lru")
private DemoService demoService;
</code></pre>
  <p data-lake-id="u594728c4" id="u594728c4"><br></p>
  <p data-lake-id="u400d06a1" id="u400d06a1"><span data-lake-id="u16ac2237" id="u16ac2237" class="lake-fontsize-12">方法维度：</span></p>
  <p data-lake-id="uf0eb37f3" id="uf0eb37f3"><span data-lake-id="u8ed2e8d7" id="u8ed2e8d7" class="lake-fontsize-12">​</span><br></p>
  <pre lang="java"><code>
&lt;dubbo:reference interface="com.foo.DemoService"&gt;
    &lt;dubbo:method name="sayHello" cache="lru" /&gt;
&lt;/dubbo:reference&gt;
</code></pre>
  <p data-lake-id="u456fdc4b" id="u456fdc4b"><span data-lake-id="u42dbd65e" id="u42dbd65e" class="lake-fontsize-12">​</span><br></p>
  <p data-lake-id="ue2fd4d69" id="ue2fd4d69"><span data-lake-id="u5c3a75cc" id="u5c3a75cc" class="lake-fontsize-12">或者：</span></p>
  <pre lang="java"><code>
@DubboReference(methods = {@Method(name="sayHello",cache = "lru")})
private DemoService demoService;
</code></pre>
 </body>
</html>